using System.Collections.Generic;
using UnityEngine;
using System.Linq;

namespace Manaddiction
{
    /// <summary>
    /// 单机游戏数据管理器 - 完整版
    /// 负责：
    /// 1. 玩家数据管理（加载/保存）
    /// 2. 提供游戏数据访问接口
    /// 3. 确保数据加载顺序正确
    /// </summary>
    public class GameDataManager : MonoBehaviour
    {
        // ================== 单例实现 ================== //
        public static GameDataManager Instance { get; private set; }

        // ================== 序列化字段 ================== //
        [Header("备用配置")]
        [Tooltip("当场景中找不到GameplayData时使用的备用数据")]
        [SerializeField] private GameplayData fallbackGameplayData;
        
        [Header("调试设置")]
        [SerializeField] private bool debugMode = false;

        // ================== 属性 ================== //
        /// <summary> 当前玩家数据 </summary>
        public UserData userData { get; private set; }
        
        /// <summary> 是否已初始化完成 </summary>
        public bool IsInitialized { get; private set; }

        // ================== 私有变量 ================== //
        private string savePath => $"{Application.persistentDataPath}/userdata.json";
        private const string defaultUsername = "Player";

        // ================== 初始化 ================== //
        private void Awake()
        {
            InitializeSingleton();
            InitializeGameSystem();
        }

        /// <summary>
        /// 初始化单例模式
        /// </summary>
        private void InitializeSingleton()
        {
            if (Instance != null && Instance != this)
            {
                Destroy(gameObject);
                return;
            }

            Instance = this;
            DontDestroyOnLoad(gameObject);
            if (debugMode) Debug.Log("GameDataManager 单例初始化完成");
        }

        /// <summary>
        /// 初始化游戏数据系统
        /// </summary>
        private void InitializeGameSystem()
        {
            // 1. 确保基础数据加载器存在
            EnsureDataLoader();
            
            // 2. 验证关键游戏数据
            ValidateGameData();
            
            // 3. 加载玩家数据
            LoadPlayerData();
            
            IsInitialized = true;
            if (debugMode) Debug.Log("游戏数据系统初始化完成");
        }

        // ================== 数据加载保障 ================== //
        /// <summary>
        /// 确保DataLoader存在（没有则自动创建）
        /// </summary>
        private void EnsureDataLoader()
        {
            if (DataLoader.Get() != null) return;
            
            var loaderObj = new GameObject("DataLoader");
            loaderObj.AddComponent<DataLoader>();
            loaderObj.transform.SetParent(transform);
            
            if (debugMode) Debug.Log("创建DataLoader实例");
        }

        /// <summary>
        /// 验证游戏关键数据是否可用
        /// </summary>
        private void ValidateGameData()
        {
            if (GetGameplayData() == null)
                Debug.LogError("GameplayData缺失！请检查DataLoader配置或设置备用数据");
            
            if (CardData.GetAll().Count == 0)
                Debug.LogError("卡牌数据未加载！请检查Resources/Cards文件夹");
        }

        // ================== 玩家数据管理 ================== //
        /// <summary>
        /// 加载或创建玩家数据
        /// </summary>
        private void LoadPlayerData()
        {
            try
            {
                if (System.IO.File.Exists(savePath))
                {
                    string json = System.IO.File.ReadAllText(savePath);
                    userData = JsonUtility.FromJson<UserData>(json);
                    if (debugMode) Debug.Log($"从 {savePath} 加载玩家数据");
                }
                else
                {
                    CreateNewPlayer();
                    if (debugMode) Debug.Log("创建新玩家数据");
                }
            }
            catch (System.Exception e)
            {
                Debug.LogError($"加载玩家数据失败: {e.Message}");
                CreateNewPlayer(); // 失败时创建新数据
            }
        }

        /// <summary>
        /// 创建新玩家档案
        /// </summary>
        private void CreateNewPlayer()
        {
            userData = new UserData
            {
                username = defaultUsername,
                cards = new UserCardData[0],
                deck = new UserDeckData()
            };
            
            // 添加初始卡牌
            AddStarterCards();
            SavePlayerData();
        }

        /// <summary>
        /// 添加初始卡牌组
        /// </summary>
        private void AddStarterCards()
        {
            // 示例：添加6张测试卡牌
            string[] starterCards = { "1", "2", "3", "4", "5", "6" };
            foreach (string cardId in starterCards)
            {
                userData.AddCard(cardId, 2);
            }
            userData.AddCoin(100);
        }

        /// <summary>
        /// 保存玩家数据到本地
        /// </summary>
        public void SavePlayerData()
        {
            try
            {
                string json = JsonUtility.ToJson(userData, true);
                System.IO.File.WriteAllText(savePath, json);
                if (debugMode) Debug.Log($"玩家数据已保存到 {savePath}");
            }
            catch (System.Exception e)
            {
                Debug.LogError($"保存玩家数据失败: {e.Message}");
            }
        }

        // ================== 游戏数据访问接口 ================== //
        /// <summary>
        /// 获取游戏配置数据（优先从DataLoader获取）
        /// </summary>
        public static GameplayData GetGameplayData()
        {
            // 1. 尝试从DataLoader获取
            if (DataLoader.Get() != null && DataLoader.Get().data != null)
                return DataLoader.Get().data;
            
            // 2. 尝试从GameDataManager获取备用数据
            if (Instance != null && Instance.fallbackGameplayData != null)
                return Instance.fallbackGameplayData;
            
            // 3. 最后尝试资源加载
            var loadedData = Resources.Load<GameplayData>("GameplayData");
            if (loadedData != null) return loadedData;
            
            Debug.LogError("无法获取GameplayData！请确保已正确配置");
            return null;
        }

        /// <summary>
        /// 根据ID获取卡牌数据（带错误处理）
        /// </summary>
        public static CardData GetCard(string cardId)
        {
            if (string.IsNullOrEmpty(cardId))
            {
                Debug.LogError("尝试获取空ID的卡牌");
                return null;
            }

            var card = CardData.Get(cardId);
            if (card == null)
                Debug.LogError($"找不到ID为 {cardId} 的卡牌");
            
            return card;
        }

        /// <summary>
        /// 获取所有卡牌数据（带缓存检查）
        /// </summary>
        public static List<CardData> GetAllCards()
        {
            var cards = CardData.GetAll();
            if (cards == null || cards.Count == 0)
                Debug.LogError("卡牌数据未加载或为空");
            
            return cards ?? new List<CardData>();
        }

        // ================== 辅助功能 ================== //
        /// <summary>
        /// 重置玩家数据（开发用）
        /// </summary>
        public void ResetPlayerData()
        {
            if (System.IO.File.Exists(savePath))
            {
                System.IO.File.Delete(savePath);
                if (debugMode) Debug.Log("已删除玩家数据文件");
            }
            
            CreateNewPlayer();
        }
    }
}